from django.shortcuts import render
from rest_framework.views import APIView
from rest_framework.permissions import IsAuthenticated
from alipay import AliPay
from django.conf import settings
from orders.models import OrderInfo
from rest_framework.response import Response
from rest_framework import status
from .models import PayModel

"""
生成支付页面
1, 当前端点击去支付
2, 生成支付页面返回
3, 前端浏览器重定向到支付页面,完成支付
4, ...
"""
class AliPayView(APIView):

    permission_classes = [IsAuthenticated]

    def get(self,request,order_id):

        #1, 根据订单编号,获取订单对象
        try:
            order = OrderInfo.objects.get(order_id=order_id,user=request.user,status=OrderInfo.ORDER_STATUS_ENUM["UNPAID"])
        except Exception as e:
            return Response({"message":"订单不存在"},status=status.HTTP_400_BAD_REQUEST)

        #2, 定义美多私钥, alipay的公钥
        app_private_key_string = open(settings.APP_PRIVATE_KEY_PATH).read()
        alipay_public_key_string = open(settings.ALIPAY_PUBLIC_KEY_PATH).read()

        #3, 创建alipay对象, 设置相关参数
        alipay = AliPay(
            appid=settings.ALIPAY_APPID,
            app_notify_url=None,  # 默认回调url
            app_private_key_string=app_private_key_string,
            # 支付宝的公钥，验证支付宝回传消息使用，不是你自己的公钥,
            alipay_public_key_string=alipay_public_key_string,
            sign_type="RSA2",  # RSA 或者 RSA2
            debug = settings.ALIPAY_DEBUG  # 默认False
        )

        #4, 创建订单字符串
        # 电脑网站支付，需要跳转到https://openapi.alipay.com/gateway.do? + order_string
        order_string = alipay.api_alipay_trade_page_pay(
            out_trade_no=order_id,
            total_amount=str(order.total_amount),
            subject="测试订单",
            return_url="http://www.meiduo.site:8080/pay_success.html",
        )


        #5, 使用网关 + 订单字符串(支付页面了)
        alipay_url = settings.ALIPAY_URL + "?" + order_string
        return Response({"alipay_url":alipay_url})


"""
保存支付结果
1, 当支付完成后,回调的时候
2, 获取前端回调的参数
    out_trade_no(美多的), trade_no(支付宝流水号),sign(校验结果的)
3, 创建alipay对象,校验参数
4, 修改订单状态,创建payment对象,设置属性
5, 入库返回响应
"""
class PaymentStatusView(APIView):

    def put(self,request):
        #1,获取参数,sign
        dict_data = request.query_params.dict()
        sign = dict_data.pop("sign")
        order_id = dict_data.get("out_trade_no")
        trade_no = dict_data.get("trade_no")

        #2,创建Alipay对象
        app_private_key_string = open(settings.APP_PRIVATE_KEY_PATH).read()
        alipay_public_key_string = open(settings.ALIPAY_PUBLIC_KEY_PATH).read()
        alipay = AliPay(
            appid=settings.ALIPAY_APPID,
            app_notify_url=None,  # 默认回调url
            app_private_key_string=app_private_key_string,
            # 支付宝的公钥，验证支付宝回传消息使用，不是你自己的公钥,
            alipay_public_key_string=alipay_public_key_string,
            sign_type="RSA2",  # RSA 或者 RSA2
            debug = settings.ALIPAY_DEBUG  # 默认False
        )

        #3,调用校验方法,判断校验结果是否正确
        success = alipay.verify(dict_data,sign)
        if not success:
            return Response({"message":"校验失败"})

        #4,修改订单状态,创建payment对象,设置属性
        try:
            #返回的是影响的行数
            ret = OrderInfo.objects.filter(order_id=order_id,status=OrderInfo.ORDER_STATUS_ENUM["UNPAID"]).\
                update(status=OrderInfo.ORDER_STATUS_ENUM["UNSEND"])

            # order = OrderInfo.objects.get(order_id=order_id,status=OrderInfo.ORDER_STATUS_ENUM["UNPAID"])
            # order.status = OrderInfo.ORDER_STATUS_ENUM["UNSEND"]

            pay = PayModel.objects.create(
                order_id=order_id,
                trade_id=trade_no
            )

        except Exception as e:
            return Response({"支付结果保存失败"},status=400)

        # 5,返回响应
        return Response({"trade_id":pay.trade_id},status=201)



